﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Net;
using UricaoWeb.Datos.ConexionBD;
using UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles;
using UricaoWeb.Datos.Excepciones.Seguridad_y_Roles;

namespace UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles
{
    public class Login
    {

        /// <summary>
        /// Metodo realizado para validar los datos para que un usuario inicie sesion.       
        /// </summary>
        /// <param name="_usuariologin">El login del usuario</param>
        /// <param name="_contrasena">La contrasena para iniciar sesion</param>
        /// <returns>Retorna el objeto usario de la BD</returns>
        public static Logica_Usuario login(string _usuariologin, string _contrasena)
        {
            try
            {
                Usuario user = UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles.Public_Class_Login.login(_usuariologin, _contrasena);
                Logica_Usuario _user = new Logica_Usuario(user.IdUsuario, user.NombreUsuario, user.FkEmpleado, user.NombreEmpleado, user.ApellidoEmpleado, user.CorreoEmpleado, user.FkHotel);
                return _user;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SLlog-1", "demasiadas peticiones al metodo login", e);
            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SLlog-1", "usuario no existe en la base de datos", e);
            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SLlog-1", "usuario no existe en la base de datos", e);
            }

        }

        /// <summary>
        /// Metodo que manda un email al usuario, indicandole el login del usuario      
        /// </summary>
        /// <param name="_nombreUsuario">El nombre del usuario</param>
        /// <param name="_apellidoUsuario">La apellido del usuario</param>
        /// <param name="_correoUsuario">correo del usuario</param>
        /// <returns>Retorna el nombre del usuario</returns>
        public static string recordarUsuario(string _nombreUsuario, string _apellidoUsuario, string _correoUsuario)
        {
            string _user = UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles.Public_Class_Login.recordarUsuario(_nombreUsuario, _apellidoUsuario, _correoUsuario);
            if (_user.Equals(" "))
            {
                return (" ");
            }

            else
            {
                return (_user);
            }
        }

        /// <summary>
        /// Metodo realizado para verificar si el usuario existe.       
        /// </summary>
        /// <param name="_nombreUsuario">El login del usuario</param>
        /// <returns>Retorna el id del usuario </returns>
        public static string VeficarUsuario(string _nombreUsuario)
        {
            string _user = UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles.Public_Class_Login.VeficarUsuario(_nombreUsuario);
            if (_user.Equals(" "))
            {
                return (" ");
            }

            else
            {
                return (_user);
            }
        }

        /// <summary>
        /// Metodo realizado para verificar si el correo del usuario existe.       
        /// </summary>
        /// <param name="_nombreUsuario">El nombre del usuario</param>
        /// <param name="_idUsuario">El id del usuario en base de datos</param>
        /// <returns>Retorna el correo del usuario </returns>
        public static string VeficarCorreo(string _nombreUsuario, int _idUsuario)
        {
            string _correo = UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles.Public_Class_Login.VeficarCorreo(_nombreUsuario, _idUsuario);
            if (_correo.Equals(" "))
            {
                return (" ");
            }

            else
            {
                return (_correo);
            }
        }

        /// <summary>
        /// Metodo realizado para cambiar la contraseña     
        /// </summary>
        /// <param name="_idUsuario">El id del usuario en base de datos</param>
        /// <param name="_nombreUsuario">El login del usuario</param>
        /// <returns>Retorna la nueva contraseña del usuario </returns>
        public static string CambiandoContrasena(string _idUsuario, string _nombreUsuario)
        {
            RandomPassword passwordGenerado = new RandomPassword();
            string _nuevoPassword = passwordGenerado.GetNewPassword();
            UricaoWeb.Datos.ConexionBD.Seguridad_y_Roles.Public_Class_Login.actualizarContrasena(_idUsuario, _nuevoPassword);
            return (_nuevoPassword);
        }
        
        /// <summary>
        /// Metodo para enviar el correo al usuario con el login del usuario     z
        /// </summary>
        /// <param name="correoTo">Correo del usuario</param>
        /// <param name="Usuario">El login del usuario </param>
        /// <returns>Retorna true si el correo se envio y false si no se envio </returns>
        public static bool EnviarCorreo(string correoTo, string Usuario)
        {
            string correoFrom = "uricaoweb@gmail.com";
            string password = "desarrollo";

            //Configuracion de correo a enviar
            MailMessage email = new MailMessage();
            email.From = new MailAddress(correoFrom);
            email.To.Add(correoTo);
            email.Subject = "(" + DateTime.Now.ToString("dd/MMM/yyy hh:mm:ss") + ") " + "Asunto: Recuperación " +
                "del Usuario";
            email.Body = "El equipo de UricaoWeb le informa que le hemos enviado un correo de " +
                "recuperaci&oacute;n de Usuario. <br/><br/> Sus datos fueron verificados; " +
                "y se le adjunto su nombre de usuario: " + Usuario +
                "<br/><br/> Debe cambiar su contrase&ntilde;a " +
                "lo m&aacute;s pronto posible.";
            email.IsBodyHtml = true;
            email.Priority = MailPriority.Normal;

            //Configuracion de correo de salida
            SmtpClient smtp = new SmtpClient();
            smtp.Credentials = new NetworkCredential(correoFrom, password);

            //Validando el host y el puerto
            string[] aux = correoFrom.Split('@');
            string host = " ";
            int port = 0;

            if (aux[1].Equals("hotmail.com"))
            {
                host = "smtp.live.com";
                port = 25;
            }
            if (aux[1].Equals("gmail.com"))
            {
                host = "smtp.gmail.com";
                port = 587;
            }

            //Retomando configuracion de correo de salida
            smtp.Host = host;
            smtp.Port = port;
            smtp.EnableSsl = true;

            try
            {
                smtp.Send(email);
                email.Dispose();
                return true;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SLenvc-1", "demasiadas peticiones al metodo EnviarCorreo", e);
            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SLenvc-1", "correo no existe en la base de datos", e);
            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SLenvc-1", "correo no existe en la base de datos", e);
            }

        }

        /// <summary>
        /// Metodo para enviar el correo al usuario con la contraseña cambiada 
        /// </summary>
        /// <param name="correoTo">Correo del usuario</param>
        /// <param name="_password">El login del usuario </param>
        /// <returns>Retorna true si el correo se envio y false si no se envio </returns>
        public static bool EnviarCorreoContrasena(string correoTo, string _password)
        {
            string correoFrom = "uricaoweb@gmail.com";
            string password = "desarrollo";

            //Configuracion de correo a enviar
            MailMessage email = new MailMessage();
            email.From = new MailAddress(correoFrom);
            email.To.Add(correoTo);
            email.Subject = "(" + DateTime.Now.ToString("dd/MMM/yyy hh:mm:ss") + ") " + "Asunto: Recuperación " +
                "de la contraseña";
            email.Body = "El equipo de UricaoWeb le informa que le hemos enviado un correo de " +
                "recuperaci&oacute;n de contraseña. <br/><br/> Sus datos fueron verificados; " +
                "y se le adjunto su nueva contraseña : " + _password +
                "<br/><br/> Debe cambiar su contrase&ntilde;a " +
                "lo m&aacute;s pronto posible.";
            email.IsBodyHtml = true;
            email.Priority = MailPriority.Normal;

            //Configuracion de correo de salida
            SmtpClient smtp = new SmtpClient();
            smtp.Credentials = new NetworkCredential(correoFrom, password);

            //Validando el host y el puerto
            string[] aux = correoFrom.Split('@');
            string host = " ";
            int port = 0;

            if (aux[1].Equals("hotmail.com"))
            {
                host = "smtp.live.com";
                port = 25;
            }
            if (aux[1].Equals("gmail.com"))
            {
                host = "smtp.gmail.com";
                port = 587;
            }

            //Retomando configuracion de correo de salida
            smtp.Host = host;
            smtp.Port = port;
            smtp.EnableSsl = true;

            try
            {
                smtp.Send(email);
                email.Dispose();
                return true;
            }
            catch (StackOverflowException e)
            {
                throw new Excepcion_Seguridad("SLenvc-2", "demasiadas peticiones al metodo EnviarCorreoContrasena", e);
            }
            catch (NullReferenceException e)
            {
                throw new Excepcion_Seguridad("SLenvc-2", "correo no existe en la base de datos", e);
            }
            catch (Exception e)
            {
                throw new Excepcion_Seguridad("SLenvc-2", "correo no existe en la base de datos", e);
            }
        }
    }
}